package dziennik.classes;
import dziennik.classes.*;

import dziennik.classes.Polaczenie;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.enterprise.inject.spi.Bean;
import javax.faces.application.Application;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;

/**
 * 
 * <p>Klasa Uzytkownik umozliwia zalogowanie na konto u�ytkownika oraz zmian� hasla uzytkownika</p>
 * 
 * @author Dominik Kaminski
 *
 */
public class Uzytkownik{
	private int id;
	private String imie;
	private String nazwisko;
	private String login;
	private String haslo;
        private String stare_haslo;
        private int tryb;
        private boolean zalogowano = false;

	public Uzytkownik(){}
	
	public Uzytkownik
	(
                String imie,
                String nazwisko,
                String login,
                String haslo
	)
	{
		this.imie=imie;
		this.nazwisko=nazwisko;
		this.login=login;
		this.haslo=haslo;
	}
	
	/**
	 * 
	 * <p>Metoda zwracajaca id uzytkownika</p>
	 * 
	 * @return int id
	 */
	public int getId(){return this.id;}
	
	/**
	 * 
	 * <p>Metoda zwraca imie uzytkownika</p>
	 * 
	 * @return String imie
	 */
	public String getImie(){return this.imie;}
	
	/**
	 * 
	 * <p>Metoda zwraca nazwisko uzytkownika</p>
	 * 
	 * @return String nazwisko
	 */
	public String getNazwisko(){return this.nazwisko;}
	
	/**
	 * 
	 * <p>Metoda zwraca login uzytkownika</p>
	 * 
	 * @return String login
	 */
	public String getLogin(){return this.login;}
	
	/**
	 * 
	 * <p>Metoda zwraca has�o uzytkownika</p>
	 * 
	 * @return String haslo
	 */
	public String getHaslo(){return this.haslo;}

        public String getStare_haslo() {
            return stare_haslo;
        }

        public void setStare_haslo(String stare_haslo) {
            this.stare_haslo = stare_haslo;
        }

	/**
	 * 
	 * <p>Metoda nadaje polu id wartosc dana w parametrze</p>
	 * 
	 * @params int num
	 */
        
	public void setId(int num){this.id=num;}
	
	/**
	 * 
	 * <p>Metoda nadaje polu imie wartosc dana w parametrze</p>
	 * 
	 * @params String text
	 */
	public void setImie(String text){this.imie=text;}
	
	/**
	 * 
	 * <p>Metoda nadaje polu nazwisko wartosc dana w parametrze</p>
	 * 
	 * @params String text
	 */
	public void setNazwisko(String text){this.nazwisko=text;}
	
	/**
	 * 
	 * <p>Metoda nadaje polu login wartosc dana w parametrze</p>
	 * 
	 * @params String text
	 */
	public void setLogin(String text){this.login=text;}
	
	/**
	 * 
	 * <p>Metoda nadaje polu haslo wartosc dan� w parametrze</p>
	 * 
	 * @params String text
	 */
	public void setHaslo(String text){this.haslo=text;}

        public int getTryb() { return tryb; }

        public void setTryb(int tryb) { this.tryb = tryb; }

        public boolean isZalogowano() {
            return zalogowano;
        }

        public void setZalogowano(boolean zalogowano) {
            this.zalogowano = zalogowano;
        }


	
	/**
	 * 
	 * <p>
	 * Metoda loguje uzytkownika w programie. W zalezno�ci od trybu sprawdza zgodnosc 
	 * loginu i hasla (szyfrowanego algorytmem MD5) w bazie danych. W razie poprawnego zalogowania 
	 * zwracana jest wartosc true, w przeciwnym razie false
	 * </p>
	 * 
	 * @params Connection con, int tryb, String str_login, String str_haslo
	 * 
	 * @return boolean
	 */
	public String zaloguj(){
	
		int id;
                Polaczenie polaczenie_bean;
                
                // DKA: pobieranie obiektu ziarna z application scope (w tym wypadku pobranie polaczenia)
                FacesContext facesContext = FacesContext.getCurrentInstance();
                Application application = facesContext.getApplication();
                ValueBinding binding = application.createValueBinding("#{polaczenie}");
                polaczenie_bean = (Polaczenie)binding.getValue(facesContext);
                System.out.println("User Name : "+polaczenie_bean.getUserName());
                
                Uzytkownik uzytkownik_bean;
                
                // DKA: pobieranie obiektu ziarna z application scope (w tym wypadku pobranie uzytkownika)
                ValueBinding binding2 = application.createValueBinding("#{uzytkownik}");
                uzytkownik_bean = (Uzytkownik)binding2.getValue(facesContext);
		
		switch(this.tryb){
			case 1: // tryb Administratora 
                        {
                                try {
                                        Statement st = polaczenie_bean.getConn().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
                                        ResultSet rs = st.executeQuery("select id from nauczyciele where login = '" + uzytkownik_bean.getLogin() + "' and haslo = '" + MD5.getMD5(uzytkownik_bean.getHaslo()) +"' and id=0");
                                        if(rs.next()){
                                                id = rs.getInt("id");
                                                this.id = id;
                                                System.out.print("ADMIN " + id);
                                                //MainWindow.Okno.user_id = id;
                                                zalogowano = true;
                                                return "admin"; 
                                        }
                                        else {
                                            System.out.println(uzytkownik_bean.getLogin() + " " +  MD5.getMD5(uzytkownik_bean.getHaslo()));
                                                //MainWindow.wyswietl_blad("B��d", "Podano niepoprawne dane logowania");
                                            zalogowano = false;
                                            return "blad_logowania";
                                        }
                                } catch (SQLException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        }
			case 2: // tryb Nauczyciela
			{
				try {
					Statement st = polaczenie_bean.getConn().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
					ResultSet rs = st.executeQuery("select id from nauczyciele where login = '" + uzytkownik_bean.getLogin() + "' and haslo = '" + MD5.getMD5(uzytkownik_bean.getHaslo()) +"' and id>0");
					if(rs.next()){
						id = rs.getInt("id");
                                                this.id = id;
						System.out.print("NAUCZYCIEL " + id);
						//MainWindow.Okno.user_id = id;
                                                zalogowano = true;
						return "nauczyciel";
					}
					else {
						//MainWindow.wyswietl_blad("B��d", "Podano niepoprawne dane logowania");
                                            zalogowano = false;	
                                            return "blad_logowania";
					}
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			case 3: // tryb Rodzica
			{
				try {
					Statement st = polaczenie_bean.getConn().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
					ResultSet rs = st.executeQuery("select id from uczen where login = '" + uzytkownik_bean.getLogin() + "' and haslo = '" + MD5.getMD5(uzytkownik_bean.getHaslo()) +"'");
					if(rs.next()){ // je�li podany login i haslo sa w tabeli z uczniami to jest to rodzic i tryb 3
						id = rs.getInt("id");
                                                this.id = id;
						System.out.print("RODZIC " + id);
						//MainWindow.Okno.user_id = id;
						zalogowano = true;
                                                return "rodzic";
					}
					else {
						//MainWindow.wyswietl_blad("B��d", "Podano niepoprawne dane logowania");
                                            zalogowano = false;	
                                            return "blad_logowania";
					}
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			default:
			{
                            zalogowano = false;
                            return "blad_logowania";
			}
		}
	}
	
	
	/**
	 * 
	 * <p>
	 * Metoda sprawdza poprawno�� podanego loginu i hasla w bazie danych
	 * i w razie poprawnosci zmienia haslo (szyfruj�c algorytmem MD5)
	 * </p>
	 * 
	 * @params Connection con, int tryb, int id_usera, String stare_haslo, String nowe_haslo
	 * 
	 * @return int
	 */
	public String zmien_haslo(){
		
            Polaczenie polaczenie_bean;
                
                // DKA: pobieranie obiektu ziarna z application scope (w tym wypadku pobranie polaczenia)
                FacesContext facesContext = FacesContext.getCurrentInstance();
                Application application = facesContext.getApplication();
                ValueBinding binding = application.createValueBinding("#{polaczenie}");
                polaczenie_bean = (Polaczenie)binding.getValue(facesContext);
                System.out.println("User Name : "+polaczenie_bean.getUserName());
                
                Uzytkownik uzytkownik_bean;
                
                // DKA: pobieranie obiektu ziarna z application scope (w tym wypadku pobranie uzytkownika)
                ValueBinding binding2 = application.createValueBinding("#{uzytkownik}");
                uzytkownik_bean = (Uzytkownik)binding2.getValue(facesContext);
            
		switch(tryb){
			case 1: // tryb Administratora 
				{
					try {
						Statement st = polaczenie_bean.getConn().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
						ResultSet rs = st.executeQuery("select id, haslo from nauczyciele where id=" + this.id);
						if(rs.next()){
							String hasloDB = rs.getString("haslo");
							if(hasloDB.equals(MD5.getMD5(stare_haslo))){
								rs.updateString("haslo", MD5.getMD5(uzytkownik_bean.haslo));
								rs.updateRow();
								System.out.print("Haslo zostalo zmienione.\n");
								return "haslo_zmienione";
							}
							else {
								//MainWindow.wyswietl_blad("B��d", "Podane haslo nie zgadza si� z istniej�cym");
								return "blad";
							}
						}
						else {
							//MainWindow.wyswietl_blad("B��d", "Administrator o podanym id nie istnieje!\n");
							return "blad";
						}
						
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			case 2: // tryb Nauczyciela
			{
				try {
					Statement st = polaczenie_bean.getConn().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
					ResultSet rs = st.executeQuery("select id, haslo from nauczyciele where id=" + this.id);
					if(rs.next()){
						String hasloDB = rs.getString("haslo");
						if(hasloDB.equals(MD5.getMD5(stare_haslo))){
							rs.updateString("haslo", MD5.getMD5(this.haslo));
							rs.updateRow();
							System.out.print("Haslo zostalo zmienione.\n");
							return "haslo_zmienione";
						}
						else {
							//MainWindow.wyswietl_blad("B��d", "Podane haslo nie zgadza si� z istniej�cym");
							return "blad";
						}
					}
					else {
						//MainWindow.wyswietl_blad("B��d", "Nauczyciel o podanym id nie istnieje!\n");
						return "blad";
					}
					
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			case 3: // tryb Rodzica
			{
				try {
					Statement st = polaczenie_bean.getConn().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
					ResultSet rs = st.executeQuery("select id, haslo from uczen where id=" + this.id);
					if(rs.next()){
						String hasloDB = rs.getString("haslo");
						if(hasloDB.equals(MD5.getMD5(stare_haslo))){
							rs.updateString("haslo", MD5.getMD5(this.haslo));
							rs.updateRow();
							System.out.print("Haslo zostalo zmienione.\n");
							return "haslo_zmienione";
						}
						else {
							//MainWindow.wyswietl_blad("B��d", "Podane haslo nie zgadza si� z istniej�cym");
							return "blad";
						}
					}
					else {
						//MainWindow.wyswietl_blad("B��d", "Rodzic o podanym id nie istnieje!\n");
						return "blad";
					}
					
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			default: {
				return "blad";
			}
		}
	}
        
        public String wyloguj() {
            zalogowano = false;
            tryb = 0;
            return "glowna";
        }
        
        public String pokaz_panel() {
            switch(tryb) {
                    case 1: 
                    {
                        return "admin";
                    }
                    case 2: 
                    {
                        return "nauczyciel";
                    }
                    case 3: 
                    {
                        return "rodzic";
                    }
                    default:
                    {
                        return "blad_logowania";
                    }
            }
        }
}